package com.qingxin.sys.dao;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import com.qingxin.sys.entity.BaseEntity;
import com.qingxin.sys.mvc.Pager;

/**
 * 数据库操作接口，提供常用操作借口定义
 */
public interface IBaseDao<T extends BaseEntity, ID extends Serializable> {
	
	/**
	 * 保存一条记录到数据库
	 * @param entity
	 * @return
	 */
	public T save(T entity);

	
	/**
	 * 根据主键删除记录
	 * @param clazz
	 * @param id
	 * @return
	 */
	public T delete(Class<T> clazz, ID id);
	
	
	/**
	 * 根据给定的实体删除对应的数据库记录
	 * @param entity
	 * @return
	 */
	public T delete(T entity);
	
	
	/**
	 * 更新指定记录
	 * @param clazz
	 * @param updater
	 * @return
	 */
	public T update(Class<T> clazz, Updater<T> updater);
    
	
	/**
	 * 根据主键获取一个实体对象
	 * @param clazz
	 * @param id
	 * @return
	 */
	public T get(Class<T> clazz, ID id);

	
	/**
	 * 根据主键获取一个实体对象
	 * @param clazz
	 * @param id
	 * @param lock
	 * @return
	 */
	public T get(Class<T> clazz, ID id, boolean lock);
	
	
	/**
	 * 从缓存中移除指定对象，可防止意外修改
	 * 
	 * @param entity
	 * @return 参数entity
	 */
	public T evict(T entity);

	
	/**
	 * 按属性获取指定对象，有多个时返回结果集中的第一条
	 * @param clazz
	 * @param property
	 * @param value
	 * @return
	 */
	public T getByProperty(Class<T> clazz, String property, Object value);

	
	
	/**
	 * 通过HQL查询数据列表
	 * @param hql
	 * @param values
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public List listByHql(String hql, Object... values);

	
	/**
	 * 通过HQL查询指定对象，有多个时返回结果集中的第一条
	 */
	public Object getByHql(String hql, Object... values);
	
	
	/**
	 * 通过HQL更新数据库（更新/删除）
	 * @param hql
	 * @param values
	 * @return
	 */
	public int updateByHql(String hql, Object... values);
	
	
	/**
	 * 通过Querier获得列表数据
	 * @param querier
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public List listByQuerier(Querier querier);
	
	
	/**
	 * 通过Querier获得分页数据对象
	 * @param querier
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	public Pager pageByQuerier(Querier querier, int pageNo, int pageSize);

	
	
	/**
	 * 获取JDBC连接，使用完后需要调用其close方法关闭。
	 * 
	 * @return
	 * @throws SQLException
	 */
	public Connection getJdbcConnection() throws SQLException;
	
}
